package com.bjpowernode.springboot.service.Impl;

import com.bjpowernode.springboot.dao.DocumentMapper;
import com.bjpowernode.springboot.entity.OfficeDocumentBean;
import com.bjpowernode.springboot.entity.PageBean;
import com.bjpowernode.springboot.service.DocumentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@SuppressWarnings("all")
@Service
public class DocumentSeviceImpl implements DocumentService {

    private final int DOC_SORT_OFFSET = 4; // 排行偏移量

    @Autowired
    private DocumentMapper documentMapper;

    /**
     * 注意：之前我将RedisTemplate<String, Object>  redisTemplate  注入，但是一直抛出 redisTemplate 找不到
     * 但是将key该为Object就正常了(不知道为啥????)
     */
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate; // 注入redis模板类，实现redis的相关操作

    @Override
    public List<OfficeDocumentBean> queryDocumentByPageBean(PageBean pageBean) {
        return documentMapper.queryDocumentByPageBean(pageBean);
    }

    @Override
    public List<OfficeDocumentBean> queryDocuments() {
        return documentMapper.queryDocuments();
    }

    @Override
    public int countDocuments() {
        return documentMapper.countDocuments();
    }

    @Override
    public void addDocument(OfficeDocumentBean odb) {
        documentMapper.addDocument(odb);
    }

    @Override
    public void loadToRedis() {
        List<OfficeDocumentBean> officeDocumentBeans = documentMapper.queryDocuments(); // 从数据库中读取所有文档数据
        ZSetOperations<Object, Object> zSetOperations = redisTemplate.opsForZSet(); // 创建zset
        for (OfficeDocumentBean documentBean : officeDocumentBeans) {
            /* zset:
                key: document(zset的键)
                k:docID(数据的键)
                score:visCount(数据的值)(按照该字段进行排序，默认是降序)
            */
            zSetOperations.add("document",documentBean.getDocId(),documentBean.getVisCount());
        }
    }

    /**
     *
     * 实现热门，即对显示的文档数据按照访问量从大到小排序，获取前5的文档
     * 两种实现方式：
     *     1. 每次我们添加新的文旦数据时，将其放置到redis缓存中，通过zset来帮助我们实现排序
     *        如果需要显示，就从redis中获取，从而减少mysql的交互
     *        或者每次当我们点击获取热门文档的按钮时，就发出一个请求，一次性将mysql中的所有数据更新到redis中
     *        然后还是通过zset实现按照字段排序，在从redis中获取所有数据显示
     *
     *     2. 直接通过mysql进行排序
     *
     * @return
     */
    @Override
    public List<OfficeDocumentBean> readhot5Doc() {
        ZSetOperations<Object, Object> zSetOperations = redisTemplate.opsForZSet();
        Set<Object> document = zSetOperations.range("document", 0, DOC_SORT_OFFSET);
        List<OfficeDocumentBean> officeDocumentBeans = new ArrayList<>();
        OfficeDocumentBean documentBean;
        for (Object doc : document) {
            documentBean = documentMapper.queryDocById((int) doc);
            officeDocumentBeans.add(documentBean);
        }
        return officeDocumentBeans;
    }

    @Override
    public OfficeDocumentBean queryDocById(int docId) {
        return documentMapper.queryDocById(docId);
    }

    @Override
    public void updataVisCount(int curVisDocId) {
        documentMapper.updataVisCount(curVisDocId);
    }

}
